/**
 * GraphQL API 适配器
 * 针对GraphQL API的请求处理适配器
 */

import RestfulAdapter from './restful';

class GraphQLAdapter {
  constructor(config = {}) {
    this.config = config;
    
    // 使用RESTful适配器处理底层请求
    this.restfulAdapter = new RestfulAdapter(config);
  }

  /**
   * 设置配置
   * @param {Object} config 适配器配置
   */
  setConfig(config) {
    this.config = {
      ...this.config,
      ...config
    };
    
    // 更新RESTful适配器的配置
    this.restfulAdapter.setConfig(config);
  }

  /**
   * 发送GraphQL请求
   * @param {Object} config 请求配置
   * @returns {Promise} 请求Promise
   */
  async request(config) {
    // 准备GraphQL请求
    const graphqlConfig = this._prepareGraphQLRequest(config);
    
    // 使用RESTful适配器发送请求
    const response = await this.restfulAdapter.request(graphqlConfig);
    
    // 处理GraphQL响应
    return this._handleGraphQLResponse(response);
  }

  /**
   * 准备GraphQL请求
   * @param {Object} config 请求配置
   * @returns {Object} 处理后的请求配置
   * @private
   */
  _prepareGraphQLRequest(config) {
    // 确保方法为POST
    const method = 'POST';
    
    // 构建GraphQL请求体
    const data = {
      query: config.data.query,
      variables: config.data.variables || {}
    };
    
    // 如果有操作名称，添加到请求体
    if (config.data.operationName) {
      data.operationName = config.data.operationName;
    }
    
    // 如果有扩展信息，添加到请求体
    if (config.data.extensions) {
      data.extensions = config.data.extensions;
    }
    
    // 设置默认的GraphQL端点
    const url = config.url || '/graphql';
    
    // 设置请求头
    const headers = {
      ...this.config.headers,
      ...config.headers,
      'Content-Type': 'application/json'
    };
    
    // 返回处理后的配置
    return {
      ...config,
      url,
      method,
      data,
      headers
    };
  }

  /**
   * 处理GraphQL响应
   * @param {Object} response 响应对象
   * @returns {Object} 处理后的响应
   * @private
   */
  _handleGraphQLResponse(response) {
    const { data } = response;
    
    // 确保响应是有效的GraphQL响应
    if (!data) {
      const error = new Error('Invalid GraphQL response: missing data');
      error.response = response;
      throw error;
    }
    
    // 处理GraphQL错误
    if (data.errors && data.errors.length > 0) {
      const error = new Error(
        data.errors[0].message || 'GraphQL query failed'
      );
      error.graphQLErrors = data.errors;
      error.response = response;
      throw error;
    }
    
    // 返回响应，但将GraphQL数据作为主要数据
    return {
      ...response,
      data: data.data,
      extensions: data.extensions,
      graphQLResponse: data
    };
  }
}

export { GraphQLAdapter };
export default GraphQLAdapter; 